{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2.1.0\n",
      "sys.version_info(major=3, minor=6, micro=9, releaselevel='final', serial=0)\n",
      "matplotlib 3.1.3\n",
      "numpy 1.18.1\n",
      "pandas 1.0.1\n",
      "sklearn 0.22.1\n",
      "tensorflow 2.1.0\n",
      "tensorflow_core.python.keras.api._v2.keras 2.2.4-tf\n"
     ]
    }
   ],
   "source": [
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import sklearn\n",
    "import pandas as pd\n",
    "import os\n",
    "import sys\n",
    "import time\n",
    "import tensorflow as tf\n",
    "\n",
    "from tensorflow import keras\n",
    "\n",
    "print(tf.__version__)\n",
    "print(sys.version_info)\n",
    "for module in mpl, np, pd, sklearn, tf, keras:\n",
    "    print(module.__name__, module.__version__)\n",
    "\n",
    "'''\n",
    "再搭建CNN模型是，使用selu激活函数\n",
    "'''"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(5000, 28, 28) (5000,)\n",
      "(55000, 28, 28) (55000,)\n",
      "(10000, 28, 28) (10000,)\n"
     ]
    }
   ],
   "source": [
    "fashion_mnist = keras.datasets.fashion_mnist\n",
    "(x_train_all, y_train_all), (x_test, y_test) = fashion_mnist.load_data()\n",
    "x_valid, x_train = x_train_all[:5000], x_train_all[5000:]\n",
    "y_valid, y_train = y_train_all[:5000], y_train_all[5000:]\n",
    "\n",
    "print(x_valid.shape, y_valid.shape)\n",
    "print(x_train.shape, y_train.shape)\n",
    "print(x_test.shape, y_test.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "scaler = StandardScaler()\n",
    "x_train_scaled = scaler.fit_transform(\n",
    "    x_train.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28, 1)\n",
    "x_valid_scaled = scaler.transform(\n",
    "    x_valid.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28, 1)\n",
    "x_test_scaled = scaler.transform(\n",
    "    x_test.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28, 1)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = keras.models.Sequential()\n",
    "model.add(keras.layers.Conv2D(filters=32, kernel_size=3,\n",
    "                              padding='same',\n",
    "                              activation='selu',\n",
    "                              input_shape=(28, 28, 1)))\n",
    "model.add(keras.layers.Conv2D(filters=32, kernel_size=3,\n",
    "                              padding='same',\n",
    "                              activation='selu'))\n",
    "model.add(keras.layers.MaxPool2D(pool_size=2))\n",
    "model.add(keras.layers.Conv2D(filters=64, kernel_size=3,\n",
    "                              padding='same',\n",
    "                              activation='selu'))\n",
    "model.add(keras.layers.Conv2D(filters=64, kernel_size=3,\n",
    "                              padding='same',\n",
    "                              activation='selu'))\n",
    "model.add(keras.layers.MaxPool2D(pool_size=2))\n",
    "model.add(keras.layers.Conv2D(filters=128, kernel_size=3,\n",
    "                              padding='same',\n",
    "                              activation='selu'))\n",
    "model.add(keras.layers.Conv2D(filters=128, kernel_size=3,\n",
    "                              padding='same',\n",
    "                              activation='selu'))\n",
    "model.add(keras.layers.MaxPool2D(pool_size=2))\n",
    "model.add(keras.layers.Flatten())\n",
    "model.add(keras.layers.Dense(128, activation='selu'))\n",
    "model.add(keras.layers.Dense(10, activation=\"softmax\"))\n",
    "\n",
    "model.compile(loss=\"sparse_categorical_crossentropy\",\n",
    "              optimizer = \"sgd\",\n",
    "              metrics = [\"accuracy\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "conv2d (Conv2D)              (None, 28, 28, 32)        320       \n",
      "_________________________________________________________________\n",
      "conv2d_1 (Conv2D)            (None, 28, 28, 32)        9248      \n",
      "_________________________________________________________________\n",
      "max_pooling2d (MaxPooling2D) (None, 14, 14, 32)        0         \n",
      "_________________________________________________________________\n",
      "conv2d_2 (Conv2D)            (None, 14, 14, 64)        18496     \n",
      "_________________________________________________________________\n",
      "conv2d_3 (Conv2D)            (None, 14, 14, 64)        36928     \n",
      "_________________________________________________________________\n",
      "max_pooling2d_1 (MaxPooling2 (None, 7, 7, 64)          0         \n",
      "_________________________________________________________________\n",
      "conv2d_4 (Conv2D)            (None, 7, 7, 128)         73856     \n",
      "_________________________________________________________________\n",
      "conv2d_5 (Conv2D)            (None, 7, 7, 128)         147584    \n",
      "_________________________________________________________________\n",
      "max_pooling2d_2 (MaxPooling2 (None, 3, 3, 128)         0         \n",
      "_________________________________________________________________\n",
      "flatten (Flatten)            (None, 1152)              0         \n",
      "_________________________________________________________________\n",
      "dense (Dense)                (None, 128)               147584    \n",
      "_________________________________________________________________\n",
      "dense_1 (Dense)              (None, 10)                1290      \n",
      "=================================================================\n",
      "Total params: 435,306\n",
      "Trainable params: 435,306\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 55000 samples, validate on 5000 samples\n",
      "Epoch 1/10\n",
      "55000/55000 [==============================] - 352s 6ms/sample - loss: 0.6195 - accuracy: 0.7861 - val_loss: 0.4492 - val_accuracy: 0.8466\n",
      "Epoch 2/10\n",
      "55000/55000 [==============================] - 337s 6ms/sample - loss: 0.4213 - accuracy: 0.8500 - val_loss: 0.3806 - val_accuracy: 0.8694\n",
      "Epoch 3/10\n",
      "55000/55000 [==============================] - 338s 6ms/sample - loss: 0.3729 - accuracy: 0.8671 - val_loss: 0.3504 - val_accuracy: 0.8762\n",
      "Epoch 4/10\n",
      "55000/55000 [==============================] - 339s 6ms/sample - loss: 0.3439 - accuracy: 0.8779 - val_loss: 0.3324 - val_accuracy: 0.8840\n",
      "Epoch 5/10\n",
      "55000/55000 [==============================] - 339s 6ms/sample - loss: 0.3242 - accuracy: 0.8841 - val_loss: 0.3294 - val_accuracy: 0.8852\n",
      "Epoch 6/10\n",
      "55000/55000 [==============================] - 339s 6ms/sample - loss: 0.3071 - accuracy: 0.8905 - val_loss: 0.3236 - val_accuracy: 0.8864\n",
      "Epoch 7/10\n",
      "55000/55000 [==============================] - 337s 6ms/sample - loss: 0.2928 - accuracy: 0.8947 - val_loss: 0.3082 - val_accuracy: 0.8922\n",
      "Epoch 8/10\n",
      "55000/55000 [==============================] - 340s 6ms/sample - loss: 0.2809 - accuracy: 0.9008 - val_loss: 0.2927 - val_accuracy: 0.8942\n",
      "Epoch 9/10\n",
      "55000/55000 [==============================] - 344s 6ms/sample - loss: 0.2720 - accuracy: 0.9028 - val_loss: 0.2803 - val_accuracy: 0.9008\n",
      "Epoch 10/10\n",
      "55000/55000 [==============================] - 341s 6ms/sample - loss: 0.2623 - accuracy: 0.9057 - val_loss: 0.2928 - val_accuracy: 0.8934\n"
     ]
    }
   ],
   "source": [
    "logdir = './cnn-selu-callbacks'\n",
    "if not os.path.exists(logdir):\n",
    "    os.mkdir(logdir)\n",
    "output_model_file = os.path.join(logdir,\n",
    "                                 \"fashion_mnist_model.h5\")\n",
    "\n",
    "callbacks = [\n",
    "    keras.callbacks.TensorBoard(logdir),\n",
    "    keras.callbacks.ModelCheckpoint(output_model_file,\n",
    "                                    save_best_only = True),\n",
    "    keras.callbacks.EarlyStopping(patience=5, min_delta=1e-3),\n",
    "]\n",
    "history = model.fit(x_train_scaled, y_train, epochs=10,\n",
    "                    validation_data=(x_valid_scaled, y_valid),\n",
    "                    callbacks = callbacks)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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G86D6OEeCJWVlbzwwgu8+uqr5OTkUFFRwbx583j33XcHvQ9jTHI+EAh025abm5uc//a3v83ChQt54okn+OCDDwa8h2/p0qV86lOfwufzsXjxYl2zFhHJUrrm3ENTUxPFxcXk5OTw7rvv8tprrxEIBHjppZd4//33AZKntc844wx+97vfJb/beVp75MiRvPPOO8RisWQPvL9jjR07FoD77rsvuf6MM87gt7/9LZFIpNvxxowZw5gxY7j11ltZunTp0DVaREQyisK5h7PPPptIJMKMGTO48cYbOf744ykvL+fOO+/kM5/5DHPnzmXJkiUA3HzzzTQ2NjJr1izmzp3LihUrAPjxj3/Mueeey4knnsjo0aP7PdY3vvEN/v3f/52jjjoqGcQAV1xxBYcddhhz5sxh7ty5PPzww8ltF110EePHj2fGjBkH6CcgIiLppvOiPXi9Xp577rk+t51zzjndlvPy8vjtb3/b69GXF1xwARdccEGv76f2jgFOOOEENm3alFy+9db448hdLhe33347t99+e699rFy5kiuvvHJQbRERkeFJ4TyMzJ8/n9zcXH7+85+nuyoiInIAKZyHkTfffDPdVRARkYNA15xFREQyjMJZREQkwyicRUREMozCWUREJMMonEVERDKMwnk/pL59qqcPPviAWbNmHcTaiIhItlA4i4iIZJiMvc/5J2/8hHfrB/+yicGYXjKdby74Zr/bb7zxRsaPH8+XvvQlAG655RZcLhcrVqygoaGBcDjMrbfeyqJFi/bquIFAgGuuuYbVq1cnn/61cOFC1q9fz9KlSwmFQsRiMR5//HHGjBnD5z73ObZt20Y0GuXb3/528nGhIiJyaMjYcE6HJUuW8JWvfCUZzsuWLeP555/n+uuvp6CggNraWo4//njOO++8bm+eGsgdd9yBMYa1a9fy7rvvcuaZZ7Jp0yZ+85vf8OUvf5mLLrqIUChENBpl+fLljBkzhmeffRaIvxxDREQOLRkbznvq4R4oRx11FNXV1ezYsYOamhqKi4sZNWoUX/3qV3nppZdwOBxs376d3bt3M2rUqEHvd+XKlVx33XUATJ8+ncMPP5xNmzZxwgkn8IMf/IBt27bxmc98hiOOOILZs2fzta99jW9+85uce+65nHzyyQequSIikqF0zbmHxYsX89hjj/HHP/6RJUuW8Pvf/56amhrefPNN1qxZw8iRI3u9o3lfff7zn+fpp5/G7/fziU98ghdffJGpU6fy1ltvMXv2bG6++Wa+973vDcmxRERk+MjYnnO6LFmyhCuvvJLa2lr+9re/sWzZMkaMGIHb7WbFihV8+OGHe73Pk08+md///vecdtppbNq0iY8++ohp06axZcsWJk2axPXXX89HH33E22+/zfTp0ykpKeHiiy+mqKiIu+666wC0UkREMpnCuYeZM2fS0tLC2LFjGT16NBdddBGf+tSnmD17NscccwzTp0/f631+8Ytf5JprrmH27Nm4XC7uu+8+vF4vy5Yt48EHH8TtdjNq1ChuuukmVq1axde//nUcDgdut5tf//rXB6CVIiKSyRTOfVi7dm1yvqysjFdffbXPcq2trbS0tPS5bcKECaxbtw4An8/Hvffe26vMjTfeyI033tht3VlnncVZZ521r1UXEZEsoGvOIiIiGUY95/20fv16rr766m7rvF4vr7/+eppqJCIiw53CeT/NnDmTNWvWpLsaIiKSRXRaW0REJMMonEVERDKMwllERCTDKJxFREQyjMJ5P+zpfc4iIiL7SuGcBSKRSLqrICIiQyhjb6Xa9cMfEnxnaN/n7J0xnVE33dTv9qF8n3NrayuLFi3q83sPPPAAP/vZzzDGMGfOHB588EF2797N1VdfzZYtWwD49a9/zZgxYzj33HOTTxr72c9+RmtrK7fccgsVFRXMmzePlStXcuGFFzJ16lRuvfVWQqEQpaWl/P73v2fkyJG0trZy3XXXsXr1aowxfPe736WpqYm3336b//zP/wTgvvvuY8uWLfziF7/Yr5+viIgMjYwN53QYyvc5+3w+nnjiiV7f27BhA7feeiuvvPIKZWVl1NfXA3D99ddz6qmn8sQTTxCNRmltbaWhoWGPxwiFQqxevRqAhoYGXnvtNYwx3HXXXfz0pz/l5z//Od///vcpLCxMPpK0oaEBt9vND37wA2677TbcbjcPPfSQXrAhIpJBMjac99TDPVCG8n3O1lpuuummXt978cUXWbx4MWVlZQCUlJQA8OKLL/LAAw8A4HQ6KSwsHDCclyxZkpzftm0bS5YsYefOnYRCISZOnAjACy+8wCOPPJIsV1xcDMBpp53GM888w4wZMwiHw8yePXsvf1oiInKgZGw4p0vn+5x37drV633ObrebCRMmDOp9zvv6vVQul4tY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\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_learning_curves(history):\n",
    "    pd.DataFrame(history.history).plot(figsize=(8, 5))\n",
    "    plt.grid(True)\n",
    "    plt.gca().set_ylim(0, 1)\n",
    "    plt.show()\n",
    "\n",
    "plot_learning_curves(history)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10000/10000 [==============================] - 20s 2ms/sample - loss: 0.3104 - accuracy: 0.8880\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[0.3103907858192921, 0.888]"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.evaluate(x_test_scaled, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
